package ve
{
	import flash.display.*;
	import iks.utils.geom.*;
	
	/**
	 * 机车基类
	 * @author StefanieKaka
	 */
	public class Vehicle extends Sprite 
	{
		/**
		 * 出现在屏幕另一侧
		 */
		public static const WRAP : String = "Wrap";
		
		/**
		 * 回弹
		 */
		public static const BOUNCE : String = "Bounce";
		
		/**
		 * 构造函数
		 */
		public function Vehicle(color : uint = 0x000000) 
		{
			m_position = new Vector2D();
			m_velocity = new Vector2D();
			
			draw(color);
		}
		
///////////////////////////////////////////////////////////////////////////////////////////////////
// 公共域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/**
		 * 获取/设置边界行为
		 */
		public function get edgeBehavior() : String
		{
			return m_edgeBehavior;
		}

		public function set edgeBehavior(value : String) : void
		{
			m_edgeBehavior = value;
		}
		
		/**
		 * 获取/设置质量
		 */
		public function get mass() : Number
		{
			return m_mass;
		}
		
		public function set mass(value : Number) : void
		{
			m_mass = value;
		}
		
		/**
		 * 获取/设置移动的最大速度
		 */
		public function get maxSpeed() : Number
		{
			return m_maxSpeed;
		}
		
		public function set maxSpeed(value : Number) : void
		{
			m_maxSpeed = value;
		}

		/**
		 * 获取/设置位置
		 */
		public function get position() : Vector2D
		{
			return m_position;
		}
		
		public function set position(value : Vector2D) : void
		{
			m_position = value;
			this.x = m_position.x;
			this.y = m_position.y;
		}
		
		/**
		 * 获取/设置速度
		 */
		public function get velocity() : Vector2D
		{
			return m_velocity;
		}
		
		public function set velocity(value : Vector2D) : void
		{
			m_velocity = value;
		}
		
		/**
		 * 设置x坐标值
		 */
		override public function set x(value : Number) : void
		{
			super.x = m_position.x = value;
		}
		
		/**
		 * 设置y坐标值
		 */
		override public function set y(value : Number) : void
		{
			super.y = m_position.y = value;
		}
		
		/**
		 * 更新
		 */
		public function update() : void
		{
			m_velocity.truncate(m_maxSpeed);
			
			m_position.add(m_velocity);
			
			if (m_edgeBehavior == WRAP)
				wrap();
			else if (m_edgeBehavior == BOUNCE)
				bounce();
				
			super.x = m_position.x;
			super.y = m_position.y;
			
			this.rotation = m_velocity.angle * 180 / Math.PI;
		}

///////////////////////////////////////////////////////////////////////////////////////////////////
// 保护域
///////////////////////////////////////////////////////////////////////////////////////////////////

		/// 绘制机车图形
		protected function draw(color : uint = 0x000000) : void
		{
			this.graphics.clear();
			this.graphics.lineStyle(0, color);
			this.graphics.moveTo(10, 0);
			this.graphics.lineTo(-10, 5);
			this.graphics.lineTo(-10, -5);
			this.graphics.lineTo(10, 0);
		}
		
		protected var m_edgeBehavior : String = WRAP;
		protected var m_mass : Number = 1.0;
		protected var m_maxSpeed : Number = 10;
		protected var m_position : Vector2D = null;
		protected var m_velocity : Vector2D = null;

///////////////////////////////////////////////////////////////////////////////////////////////////
// 私有域
///////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 回弹运动
		 */
		private function bounce() : void
		{
			if (this.stage == null)
				return;
			
			if (m_position.x > this.stage.stageWidth)
			{
				m_position.x = this.stage.stageWidth;
				m_velocity.x *= -1;
			}
			else if (m_position.x < 0)
			{
				m_position.x = 0;
				m_velocity.x *= -1;
			}
			
			if (m_position.y > this.stage.stageHeight)
			{
				m_position.y = this.stage.stageHeight;
				m_velocity.y *= -1;
			}
			else if (m_position.y < 0)
			{
				m_position.y = 0;
				m_velocity.y *= -1;
			}
		}
		
		/**
		 * 出现在屏幕另一侧运动
		 */
		private function wrap() : void
		{
			if (stage == null)
				return;
				
			if (m_position.x > this.stage.stageWidth)
				m_position.x = 0;
			if (m_position.x < 0)
				m_position.x = this.stage.stageWidth;
				
			if (m_position.y > this.stage.stageHeight)
				m_position.y = 0;
			if (m_position.y < 0)
				m_position.y = this.stage.stageHeight;
		}
	}

}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file